package main

//type (
//	subscriber chan interface{}
//	topicFunc func(v interface{}) bool
//)
//
//// 发布者对象
//type Publisher struct {
//	m sync.RWMutex
//	buffer int
//	timeout time.Duration
//	subscribers map[subscriber]topicFunc
//}
//
//// 构建一个新的发布者对象，可以设置发布超时时间和缓存队列的长度
//func NewPublisher(publishTimeout time.Duration, buffer int) *Publisher {
//	return &Publisher{
//		buffer: buffer,
//		timeout: publishTimeout,
//		subscribers: make(map[subscriber]topicFunc),
//	}
//}
//
//// 添加一个新的订阅者，订阅全部主题
//func (p *Publisher) Subscribe() chan interface{} {
//	return p.SubscribeTopic(nil)
//}
//
//// 添加一个新的订阅者，订阅过滤器筛选后的主题
//func (p *Publisher) SubscribeTopic(topic topicFunc) chan interface{} {
//	ch := make(chan interface{}, p.buffer)
//	p.m.Lock()
//	p.subscribers[ch] = topic
//	p.m.Unlock()
//	return ch
//}
//
//// 退出订阅
//func (p *Publisher) Evict(sub chan interface{}) {
//	p.m.Lock()
//	defer p.m.Unlock()
//
//	delete(p.subscribers, sub)
//	close(sub)
//}
//
//// 发布一个主题
//func (p *Publisher) Publish(v interface{}) {
//	p.m.RLock()
//	defer p.m.RUnlock()
//
//	var wg sync.WaitGroup
//	for sub, topic := range p.subscribers {
//		wg.Add(1)
//		go p.sendTopic(sub, topic, v, &wg)
//	}
//	wg.Wait()
//}
//
//// 关闭发布者对象，同时关闭所有的订阅者管道
//func (p *Publisher) Close() {
//	p.m.Lock()
//	defer p.m.Unlock()
//
//	for sub := range p.subscribers {
//		delete(p.subscribers, sub)
//		close(sub)
//	}
//}
//
//// 发送主题，可以容忍一定的超时
//func (p *Publisher) sendTopic(
//	sub subscriber,topic topicFunc, v interface{}, wg *sync.WaitGroup,
//	) {
//	defer wg.Done()
//	if topic != nil && !topic(v) {
//		return
//	}
//
//	select {
//	case sub <- v:
//	case <-time.After(p.timeout):
//	}
//}
